/*!
 * \details Biblioteca de funções para auxiliar na programação comercial
 * \author Alcione Ferreira\n
 * \since 09/11/2009\n
 * \date 19/04/2012\n
 * \version 1.0.2\n
 * \copyright GNU Public License.
 */

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <ctype.h>
#include <iostream>

#ifndef __LIBEX_H__
#define __LIBEX_H__ 1

using namespace std;

/**
 * Estrutra de dados utilizada para conversão de caracteres extendidos
 */
typedef struct caracter
	{
	/**Primeira parte decimal do caracter extendido*/
	int part1;
	/**Segunda parte decimal do caracter extendido*/
	int part2;
	/**Caracter na base Octal para utf-4*/
	const char let_oc[1];
	/**Caracter na base Octal para utf-8*/
  	const char octal[2];
	}ltr;
/**
 * Estrutura de dados utilizada para tratamento de caracteres especiais
 */
typedef struct char_especial
	{
	/** Caracter especial*/
	const char car[2];
	/** Caracter especial em markup*/
 	const char car_m[7];
	}especial_ltr;
/** Definição de mapeamento dos caracteres extendidos*/
#define MAX_MAP 95 
/** Mapeamento dos caracteres extendidos*/
const caracter Mapeamento[]={
		{-62,-95,{'\241'},{'\302','\241'}},
		{-62,-94,{'\242'},{'\302','\242'}},
		{-62,-93,{'\243'},{'\302','\243'}},
		{-62,-92,{'\244'},{'\302','\244'}},
		{-62,-91,{'\245'},{'\302','\245'}},
		{-62,-90,{'\246'},{'\302','\246'}},
		{-62,-89,{'\247'},{'\302','\247'}},
		{-62,-88,{'\250'},{'\302','\250'}},
		{-62,-87,{'\251'},{'\302','\251'}},
		{-62,-86,{'\252'},{'\302','\252'}},
		{-62,-85,{'\253'},{'\302','\253'}},
		{-62,-84,{'\254'},{'\302','\254'}},
		{-62,-82,{'\256'},{'\302','\256'}},
		{-62,-81,{'\257'},{'\302','\257'}},
		{-62,-80,{'\260'},{'\302','\260'}},
		{-62,-79,{'\261'},{'\302','\261'}},
		{-62,-78,{'\262'},{'\302','\262'}},
		{-62,-77,{'\263'},{'\302','\263'}},
		{-62,-76,{'\264'},{'\302','\264'}},
		{-62,-75,{'\265'},{'\302','\265'}},
		{-62,-74,{'\266'},{'\302','\266'}},
		{-62,-73,{'\267'},{'\302','\267'}},
		{-62,-72,{'\270'},{'\302','\270'}},
		{-62,-71,{'\271'},{'\302','\271'}},
		{-62,-70,{'\272'},{'\302','\272'}},
		{-62,-69,{'\273'},{'\302','\273'}},
		{-62,-68,{'\274'},{'\302','\274'}},
		{-62,-67,{'\275'},{'\302','\275'}},
		{-62,-66,{'\276'},{'\302','\276'}},
		{-62,-65,{'\277'},{'\302','\277'}},
		{-61,-128,{'\300'},{'\303','\200'}},
		{-61,-127,{'\301'},{'\303','\201'}},
		{-61,-126,{'\302'},{'\303','\202'}},
		{-61,-125,{'\303'},{'\303','\203'}},
		{-61,-124,{'\304'},{'\303','\204'}},
		{-61,-123,{'\305'},{'\303','\205'}},
		{-61,-122,{'\306'},{'\303','\206'}},
		{-61,-121,{'\307'},{'\303','\207'}},
		{-61,-120,{'\310'},{'\303','\210'}},
		{-61,-119,{'\311'},{'\303','\211'}},
		{-61,-118,{'\312'},{'\303','\212'}},
		{-61,-117,{'\313'},{'\303','\213'}},
		{-61,-116,{'\314'},{'\303','\214'}},
		{-61,-115,{'\315'},{'\303','\215'}},
		{-61,-114,{'\316'},{'\303','\216'}},
		{-61,-113,{'\317'},{'\303','\217'}},
		{-61,-112,{'\320'},{'\303','\220'}},
		{-61,-111,{'\321'},{'\303','\221'}},
		{-61,-110,{'\322'},{'\303','\222'}},
		{-61,-109,{'\323'},{'\303','\223'}},
		{-61,-108,{'\324'},{'\303','\224'}},
		{-61,-107,{'\325'},{'\303','\225'}},
		{-61,-106,{'\326'},{'\303','\226'}},
		{-61,-105,{'\327'},{'\303','\227'}},
		{-61,-104,{'\330'},{'\303','\230'}},
		{-61,-103,{'\331'},{'\303','\231'}},
		{-61,-102,{'\332'},{'\303','\232'}},
		{-61,-101,{'\333'},{'\303','\233'}},
		{-61,-100,{'\334'},{'\303','\234'}},
		{-61,-99,{'\335'},{'\303','\235'}},
		{-61,-98,{'\336'},{'\303','\236'}},
		{-61,-97,{'\337'},{'\303','\237'}},
		{-61,-96,{'\340'},{'\303','\240'}},
		{-61,-95,{'\341'},{'\303','\241'}},
		{-61,-94,{'\342'},{'\303','\242'}},
		{-61,-93,{'\343'},{'\303','\243'}},
		{-61,-92,{'\344'},{'\303','\244'}},
		{-61,-91,{'\345'},{'\303','\245'}},
		{-61,-90,{'\346'},{'\303','\246'}},
		{-61,-89,{'\347'},{'\303','\247'}},
		{-61,-88,{'\350'},{'\303','\250'}},
		{-61,-87,{'\351'},{'\303','\251'}},
		{-61,-86,{'\352'},{'\303','\252'}},
		{-61,-85,{'\353'},{'\303','\253'}},
		{-61,-84,{'\354'},{'\303','\254'}},
		{-61,-83,{'\355'},{'\303','\255'}},
		{-61,-82,{'\356'},{'\303','\256'}},
		{-61,-81,{'\357'},{'\303','\257'}},
		{-61,-80,{'\360'},{'\303','\260'}},
		{-61,-79,{'\361'},{'\303','\261'}},
		{-61,-78,{'\362'},{'\303','\262'}},
		{-61,-77,{'\363'},{'\303','\263'}},
		{-61,-76,{'\364'},{'\303','\264'}},
		{-61,-75,{'\365'},{'\303','\265'}},
		{-61,-74,{'\366'},{'\303','\266'}},
		{-61,-73,{'\367'},{'\303','\267'}},
		{-61,-72,{'\370'},{'\303','\270'}},
		{-61,-71,{'\371'},{'\303','\271'}},
		{-61,-70,{'\372'},{'\303','\272'}},
		{-61,-69,{'\373'},{'\303','\273'}},
		{-61,-68,{'\374'},{'\303','\274'}},
		{-61,-67,{'\375'},{'\303','\275'}},
		{-61,-66,{'\376'},{'\303','\276'}},
		{-61,-65,{'\377'},{'\303','\277'}}
		};

/** Definição de mapeamento dos caracteres especiais*/
#define MAX_MARK 3
/** Mapeamento dos caracteres especiais*/
const char_especial Markup_Map[] = {
	{{'&'},{'&','a','m','p',';'}},
	{{'º'},{'&','d','e','g',';'}},
	{{'ª'},{'&','o','r','d','f',';'}}
	};
/**
 * Função para converter caracteres extendidos em um texto.
 */
char *converter(char *, int);

#if  !defined(__WIN32__) && !defined(__WIN__)
/**
 * C++ version 0.4 char* style "itoa":\n
 * Written by Lukás Chmela\n
 * Released under GPLv3.\n
 */
char* itoa(int , char* , int );
#endif

/**
 * Função para retornar uma data subtraído uma quantidade de dias.
 */
char* data_otima(int);

/**
 * Função para retornar a data de hoje no formato AAAA-MM-DD.
 */
char* hoje();

/**
 * Função para retornar a hora atual no formato HH:MM:SS.
 */
char* agora();

/*
 * Função para retorna uma determinada data por extenso.\n
*/
char* data_extenso(char*, int);

/**
 * Função para formatar data em uma saída específica.
 */
char* data_formatada(char*, int);

/**
 * Função para formatar o documento.
 */
char *masc_doc(char*, int, int);

/**
 * Função para checar a autenticidade de documentos do tipo CPF e CNPJ.
*/
bool checar_doc(char*, int);

/**
 * Função utilizada para converter caracteres de uma string para Maíusculo.
 */
string ParaMaiusculos(string);

/**
 * Função utilizada para converter caracteres de uma string para Minúsculo.
 */
string ParaMinusculos(string);

//Tratamento de '(apostrofo)

/**
 * Função para retornar o próximo dia útil
 */
string prox_dia(string, int);

/**
 * Função para formatar numero com . nas casas acima de milhar.
 */
string casa_milhar(char *, int);

/**
 * Função para substituir , por . em string
 */
string valor_formatado(char *, int);

/**
 * Função para tratar caracteres especiais
 */
char* converter_markup(char *);

/**
 * Função para calcular a data de nascimento
 */
char* data_nasc(char *, int );

/**
 * Função para calcular a diferença entre duas horas distintas
 */
int dif_hora(char *, char * );

/**
 * Função para converter char para double e ajustar os miléssimos de centavos
 */
double char2double(const char *);
#endif /*__LIBEX_H___*/
